package com.buobao.spring01.ioc;

import com.buobao.spring01.entity.Apple;
import com.buobao.spring01.entity.Child;
import com.buobao.spring01.entity.ChineseChild;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.util.Arrays;

public class SpringApplication {
    /**
     * 通过配置来维护对象之间的关系，向积木以向，context中创建一个个对象组件，通过配置将他们组装到一起
     * @param args
     */
    public static void main(String[] args) {

        /**
         * 1.基础配置文件路径加载方式： classpath:config.xml 或者待路径的 classpath:com/buobao/config.xml 不包含jar包
         * 2.包含jar包的配置方式： classpath*:config.xml    所谓包含jar包的意思是项目依赖的jar包中的对象也可以在xml配置bean
         * 3.classpath:config-*.xml   扫描根目录下所有以config-开头的文件
         * 4.classpath:com\/**\/config.xml 扫描com包下所有的congfig.xml文件
         * 5.file:c/config.xml  c盘下文件扫描 这种是绝对路径 少用
         */
        ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
        Apple sweetApple = context.getBean("sweetApple", Apple.class);
        System.out.println(sweetApple.getTitle());

        Child lili = context.getBean("lili", Child.class);
        lili.eat();
        Child lucy = context.getBean("lucy", Child.class);
        lucy.eat();
        Child lily = context.getBean("lily", Child.class);
        lily.eat();

        Child child = (Child) context.getBean("lili");
        child.eat();

        ChineseChild chineseChild = context.getBean("chineseChild", ChineseChild.class);
        chineseChild.getApples().stream().forEach(s->{System.out.println(s.getTitle());});


        //获取当前容器中所有bean的id
        String[] beanDefinitionNames = context.getBeanDefinitionNames();
        Arrays.asList(beanDefinitionNames).stream().forEach(s->{
            System.out.println(s);
        });

//        context.getBean("").getClass().getName();

        ((ClassPathXmlApplicationContext)context).registerShutdownHook(); //主动调用销毁方法
    }
}
